package com.shop.service;

import com.shop.entity.Product;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 商品服务接口
 * 
 * 定义商品相关的业务逻辑方法
 * 
 * @author Shop Management System
 * @version 1.0
 * @since 2024-01-01
 */
public interface ProductService {
    
    /**
     * 获取所有商品
     * 
     * @return 商品列表
     */
    List<Product> getAllProducts();
    
    /**
     * 根据ID获取商品
     * 
     * @param id 商品ID
     * @return 商品信息
     */
    Product getProductById(Long id);
    
    /**
     * 根据商品编码获取商品
     * 
     * @param productCode 商品编码
     * @return 商品信息
     */
    Product findProductByCode(String productCode);
    
    /**
     * 创建商品
     * 
     * @param product 商品信息
     */
    Product addProduct(Product product);
    
    /**
     * 更新商品
     * 
     * @param product 更新的商品信息
     */
    void updateProduct(Product product);
    
    /**
     * 删除商品
     * 
     * @param id 商品ID
     */
    void deleteProduct(Long id);
    
    /**
     * 搜索商品
     * 
     * @param keyword 搜索关键词
     * @return 匹配的商品列表
     */
    List<Product> searchProducts(String keyword);
    
    /**
     * 根据分类获取商品
     * 
     * @param category 商品分类
     * @return 商品列表
     */
    List<Product> findProductsByCategory(String category);
    
    /**
     * 获取库存不足的商品
     * 
     * @param minStock 最小库存阈值
     * @return 库存不足的商品列表
     */
    List<Product> findLowStockProducts(int minStock);
    
    /**
     * 获取缺货商品
     * 
     * @return 缺货商品列表
     */
    List<Product> findOutOfStockProducts();
    
    /**
     * 增加商品库存
     * 
     * @param id 商品ID
     * @param quantity 增加的库存数量
     */
    void increaseStock(Long id, int quantity);
    
    /**
     * 减少商品库存
     * 
     * @param id 商品ID
     * @param quantity 减少的库存数量
     */
    void decreaseStock(Long id, int quantity);
    
    /**
     * 从Excel导入商品
     * 
     * @param file Excel文件
     * @return 是否导入成功
     */
    boolean importProductsFromExcel(MultipartFile file);
    
    /**
     * 导出商品到Excel
     * 
     * @return Excel文件字节数组
     */
    byte[] exportProductsToExcel();

    void importProducts(List<Product> products);

    void updateStock(Long productId, int quantity);

    /**
     * 根据状态获取商品
     * @param status 商品状态
     * @return 商品列表
     */
    List<Product> findProductsByStatus(Integer status);

    /**
     * 切换商品状态
     * @param id 商品ID
     * @param status 新状态
     */
    void changeProductStatus(Long id, Integer status);
} 